const { app, BrowserWindow, globalShortcut, Tray, nativeImage, Menu, session } = require('electron');
const path = require('path');
const { createWindow } = require('./createMainWindow.js');
const { interceptAddress } = require('../interceptAddress.js');

let mainWindow;
// 限制只能打开一个窗口
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
  app.quit();
} else {
  app.on('second-instance', () => {
    // 当运行第二个实例时,将会聚焦到 mainWindow 这个窗口
    if (mainWindow) {
      if (mainWindow.isMinimized()) mainWindow.restore();
      mainWindow.focus();
      // mainWindow.show();
    }
  });
}

// 在应用准备就绪时调用函数
app.whenReady().then(() => {
  session.defaultSession.webRequest.onBeforeSendHeaders(interceptAddress, (details, callback) => {
    if (details.url.includes('hdslb')) {
      details.requestHeaders['Referer'] = 'https://www.bilibili.com';
    }
    if (details.url.includes('bili')) {
      details.requestHeaders['Referer'] = 'https://www.bilibili.com';
    }
    callback({ cancel: false, requestHeaders: details.requestHeaders });
  });
  createTray();
  mainWindow = createWindow();
  app.on('will-quit', () => {
    // 注销所有的全局快捷键
    console.log('注销');
    globalShortcut.unregisterAll();
  });
  app.on('activate', () => {
    // 通常在 macOS 上，当点击 dock 中的应用程序图标时，如果没有其他打开的窗口，那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

// 除了 macOS 外，当所有窗口都被关闭的时候退出程序。 因此，通常对程序和它们在任务栏上的图标来说，应当保持活跃状态，直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

// 如果开发环境使用了 nginx 代理，禁止证书报错
const isPackaged = app.isPackaged;
if (!isPackaged) {
  // 证书的链接验证失败时，触发该事件
  app.on('certificate-error', function (event, webContents, url, error, certificate, callback) {
    event.preventDefault();
    callback(true);
  });
}

// 托盘
function createTray() {
  let tray;
  const imgPath = path.join(__dirname, '../../build/icon.png');
  const icon = nativeImage.createFromPath(imgPath);
  tray = new Tray(icon);
  const contextMenu = Menu.buildFromTemplate([
    { label: '播放/暂停' },
    { label: '上一首' },
    { label: '下一首' },
    {
      label: '退出',
      click: () => {
        app.quit();
      },
    },
  ]);
  tray.setContextMenu(contextMenu);
  tray.setToolTip('音乐播发器');
  tray.setTitle('Reindeer Music Player');
}
